#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
数据库初始化脚本
用于手动创建数据库表和测试账号
"""
import os
import sys
from datetime import datetime, timezone

# 添加项目根目录到Python路径
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from core.database import init_database, get_db
from apps.users.models import User
from apps.users.services import UserService
import bcrypt
import logging

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s [%(levelname)s] %(name)s: %(message)s',
    handlers=[
        logging.StreamHandler()
    ]
)
logger = logging.getLogger(__name__)

def create_test_user():
    """创建测试账号"""
    try:
        logger.info("开始创建测试账号...")
        
        # 获取数据库会话
        db = next(get_db())
        try:
            # 检查测试账号是否已存在
            existing_user = UserService.get_user_by_username(db, "test")
            if not existing_user:
                # 创建测试账号，密码使用bcrypt加密
                hashed_password = bcrypt.hashpw("test123!".encode('utf-8'), bcrypt.gensalt())
                test_user = User(
                    username="test",
                    email="test@example.com",
                    password_hash=hashed_password.decode('utf-8'),
                    is_active=True,
                    created_at=datetime.now(timezone.utc),
                    updated_at=datetime.now(timezone.utc)
                )
                db.add(test_user)
                db.commit()
                logger.info("测试账号创建成功: username=test, password=test123!")
            else:
                logger.info("测试账号已存在")
        finally:
            db.close()
            
    except Exception as e:
        logger.error(f"创建测试账号失败: {str(e)}")
        raise

def main():
    """主函数"""
    try:
        logger.info("开始执行数据库初始化脚本")
        
        # 初始化数据库（创建表）
        init_database()
        
        # 创建测试账号
        create_test_user()
        
        logger.info("数据库初始化脚本执行完成")
        logger.info("您现在可以使用测试账号登录系统了")
        logger.info("测试账号信息:")
        logger.info("- 邮箱: test@example.com")
        logger.info("- 密码: test123!")
        
    except Exception as e:
        logger.error(f"脚本执行失败: {str(e)}")
        sys.exit(1)

if __name__ == "__main__":
    main()